/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package broad.gui;

import broad.bean.Log;
import broad.bean.Objeto;
import broad.bean.Categoria;
import broad.bean.Usuario;
import broad.dao.DAOLog;
import broad.dao.DAOObjeto;
import broad.dao.DAOCategoria;
import broad.util.Arquivos;
import broad.util.CaixaMensagemGUI;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.zkoss.io.Files;
import org.zkoss.util.media.Media;
import org.zkoss.zhtml.Fileupload;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Include;
import org.zkoss.zul.Label;
import org.zkoss.zul.Row;
import org.zkoss.zul.Rows;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

/**
 *
 * @author Rafael
 */
public class ObjetoGUI extends Window{
    
    private Textbox titulo;
    private Textbox autor;
    private Datebox dataObjeto;
    private Combobox idioma;
    private Textbox keyword;
    private Textbox estrutura;
    private Textbox descricao;
    private Textbox formato;
    private Textbox tamanho;
    private Textbox requerimento;
    private Textbox tipo;
    private Combobox nome;
    private Textbox duracao;
    private Textbox interactivity_type, learning_resource_type, interactivity_level, context, typical_age_range;
    private Textbox difficulty, typical_learning_time, cost, copyright_and_other_description;
    private Textbox caminho;
    private Combobox aberto;
    private Combobox deacordo;
    private Combobox direitosautorais;
    private Combobox status;
    private Combobox categoria;
    public static Media arquivoMedia;
    private Textbox buscaTitulo;
    private Textbox buscaAutor;
    private Textbox buscaTag;
    private Textbox buscaLink;
    private Grid listarArquivos;
    private Tabbox abas;
    private Tab abaCadastro;
    private Tab abaConsulta;
    private Button cancelar;
    private final String tituloCadastro = "Cadastro de Arquivo";
    private final String tituloEdicao = "Edição de Arquivo";
    private Objeto objetoEdicao; // armazena objeto em edição atualmente
    private Row linhaSelecionada; // linha da grid de resultados referente ao objeto em edição atualmente
    private int ultimoCategoriaSelecionado; // armazena o índice da última categoria selecionada no combobox categoria
    private Include login;
    private Button sair;
    
    public void onCreate() {
        titulo = (Textbox) getFellow("tituloModal");
        autor = (Textbox) getFellow("autorModal");
        dataObjeto = (Datebox) getFellow("dataModal");
        aberto = (Combobox) getFellow("abertoModal");
        categoria = (Combobox) getFellow("categoriaModal");
        idioma = (Combobox) getFellow("idiomaModal");
        descricao = (Textbox) getFellow("descricaoModal");
        caminho = (Textbox) getFellow("caminho");
        keyword = (Textbox) getFellow("keywordModal");
        estrutura = (Textbox) getFellow("estruturaModal");
        status = (Combobox) getFellow("statusModal");
        formato = (Textbox) getFellow("formatoModal");
        requerimento = (Textbox) getFellow("requerimentoModal");
        tipo = (Textbox) getFellow("tipoModal");
        nome = (Combobox) getFellow("nomeModal");
        duracao = (Textbox) getFellow("duracaoModal");
        interactivity_type = (Textbox) getFellow("interactivity_typeModal");
        learning_resource_type = (Textbox) getFellow("learning_resource_typeModal");
        interactivity_level = (Textbox) getFellow("interactivity_levelModal");
        context = (Textbox) getFellow("contextModal");
        typical_age_range = (Textbox) getFellow("typical_age_rangeModal");
        difficulty = (Textbox) getFellow("difficultyModal");
        typical_learning_time = (Textbox) getFellow("typical_learning_timeModal");
        cost = (Textbox) getFellow("costModal");
        copyright_and_other_description = (Textbox) getFellow("copyright_and_other_descriptionModal");
        
        tamanho = (Textbox) getFellow("tamanhoModal");
        buscaTitulo = (Textbox) getFellow("buscaTitulo");
        buscaAutor = (Textbox) getFellow("buscaAutor");
        buscaTag = (Textbox) getFellow("buscaTag");
        buscaLink = (Textbox) getFellow("buscaLink");
        listarArquivos = (Grid) getFellow("listarArquivos");
        abas = (Tabbox) getFellow("abas");
        abaCadastro = (Tab) getFellow("abaCadastro");
        abaConsulta = (Tab) getFellow("abaConsulta");
        cancelar = (Button) getFellow("cancelar");
        listarCombos();
        ObjetoGUI.arquivoMedia = null; // indica que ainda não há arquivo associado ao objeto atual
        objetoEdicao = null; // indica que não há objeto em edição
        login = (Include) getFellow("login");
        sair = (Button) getFellow("sair");
        verificaLogado();
    }
    
    public void verificaLogado(){
        Usuario usu = (Usuario) Sessions.getCurrent().getAttribute("logado");
        if (usu == null){
            new CaixaMensagemGUI().caixaErro("Não há usuário logado no sistema. Favor fazer login antes de cadastrar o arquivo.", "Erro"); 
            login.setVisible(true);
            sair.setVisible(false);
        }else {
            login.setVisible(false);
            sair.setVisible(true);
        }
    }
    
    public void uploadArquivo2() throws IOException, InterruptedException {
        File dest = new File(new Arquivos().getSavePath());
        Media media = Fileupload.get();
        if (media != null) {
            Files.copy(dest, media.getStreamData());
        } else {
            new CaixaMensagemGUI().caixaAlerta("erro!", "");
        }
    }

    public void uploadArquivo(Media[] media) {
        if (media != null) {
            for (int i = 0; i < media.length; i++) {
                if (new Arquivos().testaExtensao(media[i].getName())) {
                    // extensão permitida, testar conflito de arquivo:
                    if (!conflitoArquivo(media[i].getName())) {
                        // sem conflito de arquivo, preparar arquivo para upload:
                        ObjetoGUI.arquivoMedia = media[i];
                        caminho.setValue(media[i].getName());
                        break;
                    }
                } else {
                    // extensão não permitida:
                    new CaixaMensagemGUI().caixaAlerta("O arquivo não atende ao formato especificado", "");
                    break;
                }
            }
        }
    }
       
    public void cadastrarArquivo() throws IOException {
        cadastraArquivo(ObjetoGUI.arquivoMedia);
        ObjetoGUI.arquivoMedia = null; // indica que ainda não há arquivo associado ao objeto atual
    }

    public void cadastraArquivo(Media media) throws IOException {
        
        Usuario usu = (Usuario) Sessions.getCurrent().getAttribute("logado");
        
        if (titulo.getValue().equalsIgnoreCase("") || aberto.getValue().equalsIgnoreCase(""))
            new CaixaMensagemGUI().caixaErro("Preencha Todos os campos obrigatórios", "Erro");       
        else if (usu == null)
            new CaixaMensagemGUI().caixaErro("Não há usuário logado no sistema. Favor fazer login antes de cadastrar o arquivo.", "Erro");       
        else {
            
            // upload do arquivo:
            if (media != null) {
                File diretorio = new File( new Arquivos().getSavePath() + pastaArquivo() );
                if (!diretorio.exists())
                    diretorio.mkdir();
                if (new Arquivos().getExtensao(media.getName()).equalsIgnoreCase("txt")) {//salvar arquivo txt

                    OutputStream outputStream = new FileOutputStream(new File( caminhoArquivo(media.getName()) ));

                    outputStream.write(media.getStringData().getBytes());
                    outputStream.flush();
                    outputStream.close();

                } else {  //salvar outros tipos de arquivo

                    OutputStream outputStream = new FileOutputStream(new File( caminhoArquivo(media.getName()) ));

                    InputStream inputStream = media.getStreamData();
                    byte[] buffer = new byte[1024];
                    for (int count; (count = inputStream.read(buffer)) != -1;) {
                        outputStream.write(buffer, 0, count);
                    }
                    outputStream.flush();
                    outputStream.close();
                    inputStream.close();
                }
            }

            // aponta para, ou instancia, o objeto que será cadastrado:
            Objeto objeto;
            if (objetoEdicao != null){          
                objeto = objetoEdicao;
            }
            else{
                objeto = new Objeto();
            }

            //instancia categoria e seta o id dele com o que foi selecionado no select
            Categoria cat = new Categoria();

            if (categoria.getSelectedIndex() != -1) {//se categoria informado
                cat.setIdCategoria((Integer) categoria.getSelectedItem().getValue());
                objeto.setCategoria(cat);
            }

            objeto.setLomTitle(titulo.getValue());
            objeto.setAutor(autor.getValue());
            objeto.setDataObjeto(dataObjeto.getValue());
            objeto.setLomLanguage(idioma.getValue());
            objeto.setLomDescription(descricao.getValue());
            objeto.setLomKeyword(keyword.getValue());
            objeto.setLomStructure(estrutura.getValue());
            objeto.setLomStatus(status.getValue());
            objeto.setLomFormat(formato.getValue());
            objeto.setLomSize(tamanho.getValue());
            objeto.setLomRequirement(requerimento.getValue());
            objeto.setLomType(tipo.getValue());
            objeto.setLomName(nome.getValue());
            objeto.setLomDuration(duracao.getValue());
            objeto.setLomInteractivityType(interactivity_type.getValue());
            objeto.setLomLearningResourceType(learning_resource_type.getValue());
            objeto.setLomInteractivityLevel(interactivity_level.getValue());
            objeto.setLomContext(context.getValue());
            objeto.setLomTypicalAgeRange(typical_age_range.getValue());
            objeto.setLomDifficulty(difficulty.getValue());
            objeto.setLomTypicalLearningTime(typical_learning_time.getValue());
            objeto.setLomCost(cost.getValue());
            objeto.setLomCopyrightAndOtherDescription(copyright_and_other_description.getValue());
           
            
            // se media != null, há arquivo associado:
            if (media != null){
                objeto.setLink( caminhoArquivo(media.getName()) );
                objeto.setLomLocation(caminhoArquivo(media.getName()) );
                
            }
            if (aberto.getValue().equals("Sim")) {
                objeto.setAberto(1);
            } else {
                objeto.setAberto(0);
            }
                 
            if (status.getSelectedIndex() != -1) {// se status informado
                objeto.setLomStatus(status.getValue());              
            }           
            
            objeto.setPessoa(usu.getPessoa());
            
            // determina se é cadastro ou edição:
            boolean cadastro = (objetoEdicao == null);
            
            // cadastrar ou editar:
            new DAOObjeto().inserir(objeto);
            limparCampos();
            if (cadastro)
                limparResultadosDaBusca(); // porque não iremos verificar se o novo arquivo é um resultado da busca
            else {
                encerrarEdicao();
                verificarLinhaSelecionada(objeto);
            }

            //log cadastro ou edição
            Log log = new Log();
            log.setIdUsuario(usu.getPessoa().getIdPessoa());
            log.setData(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(new Date()));
            if (cadastro)
                log.setDescricao("cadastro objeto id: " + objeto.getIdObjeto());
            else
                log.setDescricao("edição objeto id: " + objeto.getIdObjeto());
            new DAOLog().inserir(log);
            
            new CaixaMensagemGUI().caixaInformacao("Cadastro realizado com Sucesso!", "Sucesso");     
        }
    }
    
    public void atualizarNomeTipo(){
        nome.setVisible(true);
        nome.getItems().clear();
        if (tipo.getValue().equals("operating system")){
            //nome.getItems().clear();
            nome.appendChild(new Comboitem("pc-dos"));
            nome.appendChild(new Comboitem("ms-windows"));
            nome.appendChild(new Comboitem("macos"));
            nome.appendChild(new Comboitem("unix"));
            nome.appendChild(new Comboitem("multi-os"));
            nome.appendChild(new Comboitem("none"));
        } else if (tipo.getValue().equals("browser")) {
            //nome.getItems().clear();
            nome.appendChild(new Comboitem("any"));
            nome.appendChild(new Comboitem("netscape"));
            nome.appendChild(new Comboitem("ms-internet explorer"));
            nome.appendChild(new Comboitem("opera"));
            nome.appendChild(new Comboitem("amaya"));
        }
        
    }

    public void listarCombos() {
        List<Categoria> categoriaList = new DAOCategoria().buscarTodos();
        categoria.getItems().clear();

        for (Categoria proj : categoriaList) {
            Comboitem item = new Comboitem(proj.getNome());
            item.setValue(proj.getIdCategoria());
            categoria.appendChild(item);
        }

        ultimoCategoriaSelecionado = -1; // indica que não há categoria selecionado    
    }
    
    // efetua a busca no banco de dados e lista os resultados na grid:
    public void listarArquivos() {
        limparResultadosDaBusca();

        List<Objeto> lista = new DAOObjeto().buscarArquivosEdicao(
            buscaTitulo.getValue(),
            buscaAutor.getValue(),
            buscaTag.getValue(),
            buscaLink.getValue()
        );
        
        for (final Objeto objeto : lista) {

            Row linhaPrincipal = null;
            linhaPrincipal = new Row();
            linhaPrincipal.setStyle("cursor:pointer");

            //
            //numero
            String numero;
            if (objeto.getIdObjeto() == null)
                numero = "";
             else
                numero = Integer.toString(objeto.getIdObjeto());
            Label nNumero = new Label(numero);
            linhaPrincipal.appendChild(nNumero);

            //titulo
            // se título for nulo e houver link, exibir link no lugar do título, com observação
            Label nTitulo = new Label(objeto.getLomTitle());
            if ((objeto.getLomTitle() == null) && (objeto.getLink() != null)) {
                nTitulo.setStyle("color:red");
                nTitulo.setMultiline(true);
                nTitulo.setValue("(Sem título)\n" + new File( objeto.getLink() ).getName());
            } else
                nTitulo.setValue(objeto.getLomTitle());
            linhaPrincipal.appendChild(nTitulo);

            //aberto
            String arquivoAberto;
            if (objeto.getAberto() == null)
                arquivoAberto = "";
            else if (objeto.getAberto() == 1)
                arquivoAberto = "Sim";
            else
                arquivoAberto = "Não";
            Label nAberto = new Label(arquivoAberto);
            linhaPrincipal.appendChild(nAberto);
            
            //termo assinado
//            String termoAssinadoo;
//            if (objeto.getTermoAssinado() == null)
//                termoAssinadoo = "";
//            else if (objeto.getTermoAssinado() == 1)
//                termoAssinadoo = "Sim";
//            else
//                termoAssinadoo = "Não";
//            Label nTermoAssinado = new Label(termoAssinadoo);
//            linhaPrincipal.appendChild(nTermoAssinado);
            
            //editar
            Button nEditar = new Button("");
            //nEditar.setStyle("background-color:#FFFFFF; border-width:0; cursor:pointer");
            nEditar.setStyle("cursor:pointer"); // remover esta linha se for utilizar a linha anterior
            nEditar.setImage("img/icones/001_45.png");
            final Row ponteiroLinhaPrincipal = linhaPrincipal;
            nEditar.addEventListener("onClick", new EventListener() {
                @Override
                public void onEvent(Event event) throws Exception {
                    iniciarEdicao(objeto);
                    linhaSelecionada = ponteiroLinhaPrincipal;
                }
            });
            linhaPrincipal.appendChild(nEditar);            
            
            //link
            Button nLink = new Button("");
            //nLink.setStyle("background-color:#FFFFFF; border-width:0; cursor:pointer");
            nLink.setStyle("cursor:pointer"); // remover esta linha se for utilizar a linha anterior
            nLink.setImage("img/download.png");
            nLink.addEventListener("onClick", new EventListener() {
                @Override
                public void onEvent(Event event) throws Exception {
                    new ModalLinkObjetoGUI().exibir(objeto);
                }
            });
            linhaPrincipal.appendChild(nLink);

            //adiciona a linha no Grid
            listarArquivos.getRows().appendChild(linhaPrincipal);
        }      
        
        buscaTitulo.setValue(null);
        buscaAutor.setValue(null);
        buscaTag.setValue(null);        
        buscaLink.setValue(null);
        
        // nova busca realizada,
        // portanto nenhum item da lista foi obtido para edição,
        // por isso não há linha selecionada:
        linhaSelecionada = null;          
    }

    // usado pelo botão "Cancelar" do modo de edição:
    public void cancelarEdicao() {
        encerrarEdicao();
        limparCampos();
    }
    
    // usado pelo combobox "Categoria":
    public void atualizarCategoria() {
        // se estiver no modo de edição, e houver um arquivo associado ao objeto, impedir a alteração da categoria:
        if (objetoEdicao != null && objetoEdicao.getLink() != null) {
            new CaixaMensagemGUI().caixaErro("A categoria não pode ser alterada, para evitar a alteração do link do arquivo", "Erro");
            categoria.setSelectedIndex(ultimoCategoriaSelecionado);
        // senão, se a alteração da categoria gera um conflito com outro arquivo, impedir essa alteração:
        } else if (arquivoMedia != null && arquivoExiste(arquivoMedia.getName())) {
            new CaixaMensagemGUI().caixaErro("Não foi possível selecionar esta categoria, porque já existe um arquivo de mesmo nome associado a esta categoria", "Erro");
            categoria.setSelectedIndex(ultimoCategoriaSelecionado);            
        // senão, armazenar o índice selecionado:
        } else
            ultimoCategoriaSelecionado = categoria.getSelectedIndex();
    }

    // inicia o modo de edição, para um objeto:
    private void iniciarEdicao(Objeto objeto) {        
        limparCampos();
        
        abas.setSelectedTab(abaCadastro);
        abaCadastro.setLabel(tituloEdicao);
        cancelar.setVisible(true);
        
        titulo.setValue(objeto.getLomTitle());
        autor.setValue(objeto.getAutor());
        dataObjeto.setValue(objeto.getDataObjeto());
        idioma.setValue(objeto.getLomLanguage());
        descricao.setValue(objeto.getLomDescription());
        keyword.setValue(objeto.getLomKeyword());
        estrutura.setValue(objeto.getLomStructure());
        status.setValue(objeto.getLomStatus());
        formato.setValue(objeto.getLomFormat());
        tamanho.setValue(objeto.getLomSize());
        requerimento.setValue(objeto.getLomRequirement());
        tipo.setValue(objeto.getLomType());
        nome.setValue(objeto.getLomName());
        duracao.setValue(objeto.getLomDuration());
        interactivity_type.setValue(objeto.getLomInteractivityType());
        learning_resource_type.setValue(objeto.getLomLearningResourceType());
        interactivity_level.setValue(objeto.getLomInteractivityLevel());
        context.setValue(objeto.getLomContext());
        typical_age_range.setValue(objeto.getLomTypicalAgeRange());
        difficulty.setValue(objeto.getLomDifficulty());
        typical_learning_time.setValue(objeto.getLomTypicalLearningTime());
        cost.setValue(objeto.getLomCost());
        copyright_and_other_description.setValue(objeto.getLomCopyrightAndOtherDescription());
        




        if (objeto.getAberto() != null) {
            if (objeto.getAberto() == 1)
                aberto.setValue("Sim");
            else
                aberto.setValue("Não");
        }
        
        if (objeto.getLomStatus() != null)
            status.setValue(objeto.getLomStatus());
        
        if (objeto.getCategoria()!= null) {
            int idCategoria = objeto.getCategoria().getIdCategoria();
            String nomeCategoria = new DAOCategoria().buscar(idCategoria).getNome();
            categoria.setValue(nomeCategoria);
            ultimoCategoriaSelecionado = categoria.getSelectedIndex();
        }
        
        if (objeto.getLink() != null)
            // extrai o nome do arquivo de objeto.getLink():
            caminho.setValue(new File( objeto.getLink() ).getName());
        else
            caminho.setValue(null);
        objetoEdicao = objeto;
       
    }
    
    // encerra o modo de edição:
    private void encerrarEdicao() {
        abas.setSelectedTab(abaConsulta);
        abaCadastro.setLabel(tituloCadastro);
        cancelar.setVisible(false);
        objetoEdicao = null;
    }    
    
    // esvazia os campos da aba de cadastro/edição:
    private void limparCampos() {
        buscaTitulo.setValue(null);
        buscaAutor.setValue(null);
        buscaTag.setValue(null);
        buscaLink.setValue(null);
        
        titulo.setValue(null);
        autor.setValue(null);
        dataObjeto.setValue(null);
        idioma.setValue(null);
        idioma.setSelectedIndex(-1);
        descricao.setValue(null);
        aberto.setValue(null);
        aberto.setSelectedIndex(-1);
        keyword.setValue(null);
        estrutura.setValue(null);
        status.setValue(null);
        status.setSelectedIndex(-1);
        formato.setValue(null);
        tamanho.setValue(null);
        requerimento.setValue(null);
        tipo.setValue(null);
        nome.setValue(null);
        duracao.setValue(null);
        interactivity_type.setValue(null);
        learning_resource_type.setValue(null);
        interactivity_level.setValue(null);
        context.setValue(null);
        typical_age_range.setValue(null);
        difficulty.setValue(null);
        typical_learning_time.setValue(null);
        cost.setValue(null);
        copyright_and_other_description.setValue(null);
        categoria.setValue(null);
        categoria.setSelectedIndex(-1);
        ultimoCategoriaSelecionado = -1;
        caminho.setValue(null);
    }

    // esvazia a lista de resultados da busca por arquivos:
    private void limparResultadosDaBusca() {
        listarArquivos.getRows().detach();
        listarArquivos.appendChild(new Rows());
    }    
    
    // atualiza a linha de resultado, caso algum campo visível nessa linha tenha sido alterado:
    private void verificarLinhaSelecionada(Objeto objeto) {
        // se o objeto atualizado está na listagem, pode ser preciso atualizar os campos:
        if (linhaSelecionada != null) {
            // índices dos campos na listagem:
            final int indiceTitulo = 1, indiceAberto = 2, indiceTermo = 3;
            // atualizar o campo "Título" na listagem:
            //   antes, remover qualquer estilo, pois se o título era nulo, um estilo foi adicionado:
//            Label lTitulo = (Label)linhaSelecionada.getChildren().get(indiceTitulo);
//            lTitulo.setStyle(null);
//            lTitulo.setValue(objeto.getTitulo());
            // atualizar o campo "Aberto" na listagem:
            //   antes, converter integer para string:
            String arquivoAberto;
            if (objeto.getAberto() == 1)
                arquivoAberto = "Sim";
            else
                arquivoAberto = "Não";
            ((Label)linhaSelecionada.getChildren().get(indiceAberto)).setValue(arquivoAberto);
            // atualizar o campo "Termo Assinado" na listagem:
            //   antes, converter integer para string:
//            String termoAssinado;
//            if (objeto.getTermoAssinado() == null)
//                termoAssinado = null;
//            else if (objeto.getTermoAssinado() == 1)
//                termoAssinado = "Sim";
//            else
//                termoAssinado = "Não";
//            ((Label)linhaSelecionada.getChildren().get(indiceTermo)).setValue(termoAssinado);
        }
    }    
    
    // determina se o arquivo já existe, dado o nome do arquivo:
    private boolean arquivoExiste(String nomeArquivo) {
        return new File( caminhoArquivo(nomeArquivo) ).exists();
    }
    
    // verifica se o arquivo a ser enviado tem o mesmo nome de algum arquivo associado a um objeto de mesma categoria,
    // ou se já existe arquivo associado ao objeto atual e o arquivo a ser enviado tem um nome diferente:
    private boolean conflitoArquivo(String nomeArquivo) {
        // cadastro de novo objeto ou edição de objeto que não tem arquivo anterior:
        if (objetoEdicao == null || objetoEdicao.getLink() == null) {
            if (arquivoExiste(nomeArquivo)) {
                new CaixaMensagemGUI().caixaErro("Já existe um arquivo de mesmo nome associado a um objeto da mesma categoria","Erro");
                return true;
            }
            return false;
        }
        // edição de objeto que tem arquivo anterior:
        //  extrai o nome do arquivo de objeto.getLink()
        if (!nomeArquivo.equals( new File( objetoEdicao.getLink() ).getName() )) {
            new CaixaMensagemGUI().caixaErro("O nome do novo arquivo difere do nome do arquivo anterior","Erro");            
            return true;
        }
        return false;
    }

    // retorna a pasta na qual o arquivo será salvo, de acordo com a sua categoria:
    private String pastaArquivo() {
        if (categoria.getSelectedIndex() == -1)
            return "0/";
        else
            return ((Integer) categoria.getSelectedItem().getValue()).toString() + "/";
    }
    
    // retorna o caminho completo no qual o arquivo será salvo, dado o nome do arquivo:
    private String caminhoArquivo(String nomeArquivo) {
        return new Arquivos().getSavePath() + pastaArquivo() + nomeArquivo;
    }    
    public void deslogar() {
        Sessions.getCurrent().removeAttribute("logado");
        Executions.getCurrent().sendRedirect("logout.zul");
    }
}
